// Symbol 数据类型

// // shared.js ===================

// const cache = {};

// // a.js =============================

// cache['a.foo'] = Math.random();

// // b.js =============================

// cache['b.foo'] = '123';

// console.log(cache);

// 1. 实例对象唯一

const s = Symbol();
console.log(s);
console.log(typeof s);

console.log(Symbol() === Symbol());

// 2. 用于私有成员使用

// a.js ==============================
const name = Symbol();
const person = {
    [name]: 'zce',
    say() {
        console.log(this[name]);
    },
};

// b.js =======================================

// person[Symbol()]
person.say();

// number string boolean undefined null object( RegExp Date Array Function ) Symbol BigInt

// more

const s1 = Symbol.for('foo');
const s2 = Symbol.for('foo');
console.log(s1 === s2);

console.log(Symbol.for(true) === Symbol.for('true'));

console.log(Symbol.iterator);
console.log(Symbol.hasInstance);

const obj = {
    [Symbol.toStringTag]: 'XObject',
};

console.log(obj.toString());

const obj2 = {
    [Symbol()]: 'symbol value',
    foo: 'normal value',
};

for (var key in obj2) {
    console.log(key);
}

console.log(Object.keys(obj2));

console.log(Object.getOwnPropertySymbols(obj2));
